package ar.edu.utn.frgp.TPFinalBanco.action;


import java.math.BigDecimal;
import java.util.Date;

import ar.edu.utn.frgp.TPFinalBanco.model.Cuenta;
import ar.edu.utn.frgp.TPFinalBanco.model.Movimiento;
import ar.edu.utn.frgp.TPFinalBanco.model.OrigenMovEnum;
import ar.edu.utn.frgp.TPFinalBanco.model.TipoMovimientoEnum;
import ar.edu.utn.frgp.TPFinalBanco.model.Transferencia;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionCuentaServiceImpl;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionMovimientosServiceImpl;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionTransferenciaServiceImpl;


public class RealizarTransferenciaAction extends BaseAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String nroCuentaOrigen;
	private String nroCuentaDestino;
	private Double monto;
	
	public String execute() throws Exception{
		
		try {
			
			//verificamos que las cuentas existan :)
			GestionCuentaServiceImpl cuentaService = (GestionCuentaServiceImpl) getContext()
					.getBean("gestionCuentasService");
			
			Cuenta cuentaOrigen = cuentaService.getCuenta(Integer.parseInt(nroCuentaOrigen));
			Cuenta cuentaDestino = cuentaService.getCuenta(Integer.parseInt(nroCuentaDestino));
			
			if (cuentaOrigen == null || cuentaDestino == null){
				addActionError("Alguna de las cuentas seleccionadas no existe. Verifique los numeros y vuelva a intentarlo.");
				return INPUT;
			}
			
			//validamos que le alcance la plata
			if (cuentaOrigen.getSaldo().subtract(BigDecimal.valueOf(monto)).abs().compareTo(cuentaOrigen.getDescubierto()) >= 1 ){
				addActionError("La cuenta de origen no posee suficiente dinero.");
				return INPUT;
			}
			
			
			//guardamos la transferencia
			GestionTransferenciaServiceImpl transfService = (GestionTransferenciaServiceImpl) getContext()
					.getBean("gestionTransferenciasService");
			
			Transferencia oTrans = new Transferencia();
			
			oTrans.setFecha(new Date());
			oTrans.setNroCtaOrigen(Integer.parseInt(nroCuentaOrigen));
			oTrans.setNroCtaDestino(Integer.parseInt(nroCuentaDestino));
			oTrans.setMonto(BigDecimal.valueOf(monto));
			
			transfService.createTransferencia(oTrans);
			
			/////////////////////////////////////
			//Actualizamos los saldo gato
			
			//Genero el movimiento y lo agrego en la BD
			Movimiento movimiento = new Movimiento(cuentaOrigen, new Date(), TipoMovimientoEnum.E, OrigenMovEnum.TR, cuentaOrigen.getSaldo(), BigDecimal.valueOf(monto));
			GestionMovimientosServiceImpl movimientosService = (GestionMovimientosServiceImpl) getContext().getBean("gestionMovimientosService");
			movimientosService.createMovimiento(movimiento);
			
			cuentaOrigen.setSaldo(cuentaOrigen.getSaldo().subtract(BigDecimal.valueOf(monto)));
			
			//Genero el movimiento y lo agrego en la BD
			movimiento = new Movimiento(cuentaDestino, new Date(), TipoMovimientoEnum.D, OrigenMovEnum.TR, cuentaDestino.getSaldo(), BigDecimal.valueOf(monto));
			movimientosService.createMovimiento(movimiento);
			
			cuentaDestino.setSaldo(cuentaDestino.getSaldo().add(BigDecimal.valueOf(monto)));
			
			cuentaService.updateCuenta(cuentaOrigen);
			cuentaService.updateCuenta(cuentaDestino);
			
			/////////////////////////////////////
			
			
			return SUCCESS;
		} catch (Exception e) {
			addActionError("Un error ha ocurrido mientras se realizaba la operación. Vuelva a intentarlo mas tarde.");
			return ERROR;
		}
		
	}

	
	public String getNroCuentaOrigen() {
		return nroCuentaOrigen;
	}

	public void setNroCuentaOrigen(String nroCuentaOrigen) {
		this.nroCuentaOrigen = nroCuentaOrigen;
	}

	public String getNroCuentaDestino() {
		return nroCuentaDestino;
	}

	public void setNroCuentaDestino(String nroCuentaDestino) {
		this.nroCuentaDestino = nroCuentaDestino;
	}

	public Double getMonto() {
		return monto;
	}

	public void setMonto(Double monto) {
		this.monto = monto;
	}
	
}
